Docker4 容器

创建容器

新建容器

1
docker create -it  ubuntu:16.04

-i:保持标准输入打开
-t:是否分配一个伪终端
使用docker create创建的容器默认是停止状态

1
root@ubuntu:~# docker ps

查看已经启动的容器

1
2
3
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 22 minutes ago Created elated_shockley

查看所有的容器

启动容器

1
docker start f9736

使用docker start + 容器的ID来启动容器

1
2
3
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 24 minutes ago Up 46 seconds elated_shockley

再次使用docker ps就能看见刚刚启动的容器了

新建并启动容器

1
docker run  ubuntu:14.04 /bin/echo "11111"

docker run等价于先执行docker create 在执行docker start,之后输出11111,最后停止容器。

当使用docker run来创建容器时,在docker后台运行的标准操作包括:

  1. 检查本地是否要要运行的镜像,不存在就从公有仓库下载
  2. 利用镜像来创建一个容器,并启动该容器
  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟的接口到容器中
  5. 从网桥的地址池分配一个IP地址给容器
  6. 执行用户的应用程序
  7. 执行完毕后容器自动终止
1
2
3
4
5
6
7
8
9
10
11
12
root@ubuntu:~# docker run -it  ubuntu:14.04  /bin/bash   
root@dcd459d13060:/# pwd
/
root@dcd459d13060:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@dcd459d13060:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
15 ? 00:00:00 ps
root@dcd459d13060:/# exit
exit
root@ubuntu:~#

可以使用ctrl + d 或者exit退出容器

守护态运行

1
docker run -d  ubuntu:14.04 /bin/sh -c "while true; do echo 1111; sleep 1;done"

加上参数-d就能让容器在后台以守护态方式运行。
可以使用docker logs + id 查看日志信息

1
2
3
4
5
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 3 minutes ago Up 3 minutes musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." About an hour ago Up About an hour naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 2 hours ago Up 2 hours elated_shockley

1
2
3
4
5
root@ubuntu:~# docker logs  7a1cce
1111
1111
1111
......

终止容器

1
2
3
4
5
root@ubuntu:~# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 13 minutes ago Up 13 minutes musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." About an hour ago Up About an hour naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 3 hours ago Up 2 hours elated_shockley

使用dcoker stop + id可以实现容器的停止【首先发送SIGTERM信号,10s后在发送SIGKILL来终止容器】

1
2
root@ubuntu:~# docker stop 7a1cce
7a1cce

使用dcoker kill + id可以实现容器的停止【直接发送SIGKILL来终止容器】

1
2
root@ubuntu:~# docker kill 565d
565d

使用dcoker restart + id可以实现容器的重新启动

1
2
root@ubuntu:~# docker restart 7a1cc
7a1cc

使用dcoker start + id可以实现容器的停止

1
2
root@ubuntu:~# docker start 565d89
565d89

使用dcoker ps -qa可以查看所用容器的id

1
2
3
4
root@ubuntu:~# docker ps -qa
7a1cce3f1981
565d89975177
f9736e4b4e92

进入容器

当容器使用-d参数时,容器后进入后台。用户无法看到容器的信息,也无法进行操作。下面介绍三种进入容器的方法。

1
2
3
4
5
root@ubuntu:~# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 26 minutes ago Up 5 seconds musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." About an hour ago Up 11 minutes naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 3 hours ago Up 2 hours elated_shockley

attach

1
2
3
root@ubuntu:~# docker attach 7a1cce3f1981 
1111
1111

使用docker attach + 容器名称/容器id【注意这里是容器的名称】

使用attach不方便,因为当多个窗口同时使用attach连接到同一个容器的时候,所有的窗口都会同步显示。当某个窗口阻塞的时候,其他窗口也无法执行其他操作了。

exec

1
2
3
root@ubuntu:~# docker exec -it 565d89975177 /bin/bash
root@565d89975177:/# pwd
/

使用docker exec + 选项 + 命令 【上面的-it表示打开标准输入和输出,并分配一个伪终端】,exec命令是推荐的对容器的操作方式。
其他参数:
-t:分配伪终端,默认为false
-i:打开标准输入,默认是false
–privileged:是否以最高权限执行命令,默认为false
-u:执行命令的用户名或uid

nsenter

删除容器

1
2
3
4
5
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 3 hours ago Exited (0) 3 hours ago musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." 4 hours ago Up 3 hours naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 6 hours ago Up 6 hours elated_shockley

删除一个容器

1
2
root@ubuntu:~# docker rm 7a1cce3f1981 
7a1cce3f1981

docker rm 命令只能删除处于终止火车退出状态的容器。并不能删除还处于运行状态的容器。可以添加-f参数来删除一个还在运行中的容器。使用-f参数,Docker会先发一个SIGKILL信号给容器,终止应用,再将其删除。

1
2
3
4
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." 4 hours ago Up 3 hours naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 6 hours ago Up 6 hours elated_shockley

不使用-f参数

1
2
root@ubuntu:~# docker rm 565d89975177
Error response from daemon: You cannot remove a running container 565d89975177b855ebf9e80636e85613b5ad9f9e40ef9c5f7f6edeca12efd155. Stop the container before attempting removal or use -f

使用-f参数删除

1
2
root@ubuntu:~# docker rm -f  565d89975177
565d89975177

导入导出容器

使用docker export可以到处一个容器,不管是这个容器是否处于运行状态

导出容器

1
root@ubuntu:~# docker export -o test_export.tar.gz f9736e4b4e92

docker export -o + 文件路径及名称 + 容器id

导入容器

1
root@ubuntu:~# docker import test_export.tar.gz  rexyan/ubuntu:v1.0

可以使用docker import + 文件 + 镜像标签

结果

1
2
3
4
5
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rexyan/ubuntu v1.0 fb9d66f12998 12 seconds ago 85.2 MB
ubuntu 16.04 adfebeb0ac91 3 weeks ago 111 MB
ubuntu 14.04 b42bcb3a6514 3 weeks ago 210 MB

实际上我们也可以使用docker load来导入一个镜像到本地镜像库,也可以使用docker import来导入一个容器快照到本地镜像库。这两者的区别在于:

  1. 容器快照将丢失所有的历史记录和元数据信息【即仅保存容器当时的快照信息】,而镜像文件将保存完整的记录。
  2. 容器快照的大小与镜像相比,容器快照的大小更小。
  3. 容器快照的导入方式可以重新指定标签等元数据信息。

拷贝文件到容器中

1
docker cp /tmp/文件.tar.gz 70939372d08a:/tmp

拷贝/tmp/文件.tar.gz文件到 70939372d08a容器中的/tmp目录下

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker create -it ubuntu:16.04  # 使用 ubuntu:16.04 创建一个带标准输入且有终端的容器,这个容器处于停止状态
docker run ubuntu:14.04 /bin/echo "11111" # 使用 ubuntu:14.04 创建且运行一个容器,并输出"11111",输出会后退出容器
docker run -it ubuntu:14.04 /bin/bash # 使用ubuntu:14.04创建一个带标准输入且有终端的容器,这个容器处于运行状态
docker restart 7a1cc # 重启id为7a1cc的容器
docker start 565d89 # 启动id为565d89的容器
docker kill 565d # 立即杀死id为565d容器
docker stop 7a1cce # 停止id为7a1cce的容器【这个有10s的倒计时】
docker logs 7a1cce # 查看id为7a1cce的容器的日志和输出信息
docker rm -f 565d89975177 # 强制删除id为565d89975177的容器
docker rm 565d89975177 # 删除id为565d89975177的容器
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo 1111; sleep 1;done" # 创建一个容器,且后台以守护态运行
docker attach 7a1cce3f1981 # 进入id为7a1cce3f1981的容器
docker exec -it 565d89975177 /bin/bash # 进入id为565d89975177的容器,且打开标准输入和终端,并使用bash
docker ps -qa # 查看所有容器的id
docker export -o test_export.tar.gz f9736e4b4e92 #将容器导出到文件
docker import test_export.tar.gz rexyan/ubuntu:v1.0 # 从文件导入容器,并指定标签信息